# 函数的多返回值
def test_return():
    return 1, 2, 'hello', ['测试1', '测试2']

x, y, z, list1 = test_return()

print(x)
print(y)
print(z)
print(list1)

"""
函数的多种入参：
    位置参数
    关键字参数
    缺省参数
    不定长参数（可变参数）
"""
# 位置参数
def func_param(x, y, z):
    return x + y + z

print(f"位置参数的使用：{func_param(1, 2, 3)}")

# 关键字参数
def func_param(name, age, gender):
    print(f"name={name},age={age},gender={gender}")

func_param(name='小明', age=18, gender='女')

# 位置参数和关键字参数混用，位置参数需要放在最前面
func_param('小红', 20, gender='未知')

# 缺省参数
def func_param(name, age, gender='嘿嘿嘿'):
    print(f"name={name},age={age},gender={gender}")

func_param(None,None)
func_param('小绿', 30)
func_param('小绿', 30, '男')

# 不定长参数，包含：位置参数，关键字传递
def func_param(*args):
    print(f"不定长参数之位置参数的类型{type(args)},值：{args}")

# 使用位置参数时，接收参数的args类型为tuple
func_param(1, 2, 3, '测试')

# 不定长参数之关键字传递
def func_param(**keyword):
    print(f"不定长参数之关键字参数的类型{type(keyword)},值：{keyword}")
    print(f"name为：{keyword['name']}")
# 使用关键字参数时，接收参数的keyword的类型为：字典dict
func_param(name='小王', age=80, gender='外星人')


"""
函数入参为函数的使用
    之前的函数，入参都是具体的入参，函数内部有执行逻辑
    现在的函数，入参是一个函数，在该函数中，传入具体的值，执行入参函数的逻辑，相当于是传入了一段逻辑
"""

def func_param_func(add):
    result = add(1, 2)
    print(f"入参add的类型：{type(add)}")
    print(f"result的值为：{result}")

def add(x, y):
    return x + y

func_param_func(add)

# 入参函数只有一行执行逻辑时，可以通过传入一个lambda函数替换
func_param_func(lambda x, y: x - y)

